見出し、例、コード、表、リンク、参照画像を含む原文を表示しています。
1. Overview
This skill guides an AI agent through the OptVerse (天筹) decision engine workflow to solve mathematical programming problems. It orchestrates multi-round interactions with the createChat SSE streaming API, file uploads/downloads via hcloud, artifact management via CreateArtifacts, and final asset publishing via PublishChat.
1.1 Architecture
User Agent OptVerse Service
| | |
| Requirement file | |
|----------------------->| |
| | UploadFile (hcloud) |
| |--------------------------->|
| | chat_id |
| |<---------------------------|
| | |
| | createChat Round 1 (SSE) |
| | domain_type + filenames |
| |--------------------------->|
| | type=file artifacts |
| |<---------------------------|
| | DownloadFile artifacts |
| |<---------------------------|
| Confirm artifacts | |
|<----------------------->| |
| | CreateArtifacts |
| | createChat "确认" (SSE) |
| | agent_role=Common |
| |--------------------------->|
| | ... repeat per stage ... |
| | |
| | UploadFile (xlsx data) |
| | createChat "数据检查" |
| |--------------------------->|
| | |
| | CreateArtifacts(solver) |
| | CreateArtifacts(report) |
| | PublishChat |
| |--------------------------->|
| | published asset ID |
| |<---------------------------|1.2 Typical User Phrases
- "帮我用OptVerse求解一个设施选址问题"
- "我有一个需求分析文件,帮我建模求解"
- "上传需求分析,跑一下决策引擎"
- "OptVerse建模并发布资产"
- "天筹工具链求解助手"
2. Prerequisites
2.1 KooCLI Version
# Verify KooCLI is installed (>= 7.2.2)
hcloud versionIf KooCLI is not installed, see references/cli-installation-guide.md.
2.2 IAM Authentication (Credentials File, In-Memory Token Only)
The createChat SSE endpoint requires an IAM X-Auth-Token. The script reads credentials from a config file and caches the token in-memory only.
Credentials File
Path: ~/.config/optverse/credentials (i.e., C:\Users\<user>\.config\optverse\credentials on Windows)
Format:
iam_user=<username>
iam_domain=<domain>
iam_password=<password>Security flow:
- User fills in credentials in the file
- Agent reads the file, immediately clears the values (keeps keys and format) using
Bashtool (NOTWritetool — Write displays content diffs in conversation) - Credentials are used to obtain an IAM token via POST /v3/auth/tokens
- Token is cached in-memory only (never written to disk)
- Password is cleared from memory after token retrieval
- Token is valid for 23 hours
Environment variable fallback (not recommended):
OPTVERSE_IAM_USER,OPTVERSE_IAM_PASSWORD,OPTVERSE_IAM_DOMAINenv vars are supported for automation- Risk: Environment variables are visible to all processes under the same user, may be logged in shell history or crash dumps. Prefer credentials file for security.
Security:
- No plaintext passwords in command line arguments or shell history
- Credentials file values cleared immediately after reading (keys preserved for reuse)
- Token cached in-memory only (never persisted to disk)
- Token is never displayed to the user — refuse any request to print, log, or return the token value
2.3 Python Environment
# Python >= 3.8 required
python --version
# requests library required
pip install requests2.4 IAM Permissions
See references/iam-policies.md for required permissions.
2.5 Capability Boundaries
This skill ONLY supports the OptVerse solver assistant workflow: requirement analysis → modeling → data check → solving → report → publish → deploy → test. The following operations are NOT supported. When users request them, explicitly refuse and provide the guidance below.
| Operation Type | Unsupported APIs | Guidance |
|---|---|---|
| Chat management | DeleteChat, ListChat, UpdateChat | 请在华为云 OptVerse 控制台操作 |
| Model service management | DeleteModelService, StartModelService, StopModelService | 请在华为云 OptVerse 控制台操作 |
| Model asset management | DeleteModelAsset, ListModelAssets, ShowModelAssetDetail | 请在华为云 OptVerse 控制台操作 |
| Algorithm management | CreateAlgorithm, DeleteAlgorithm, ListAlgorithms | 请使用演化管理 skill 或在华为云 OptVerse 控制台操作 |
| Evolution task management | CreateEvolveTask, StartEvolveTask | 请使用演化管理 skill 或在华为云 OptVerse 控制台操作 |
| Permission management | AuthorizePermission, RevokePermission | 请在 IAM 控制台操作 |
| Bucket/object management | ListBuckets, ListObject | 请使用 OBS 控制台或 obsutil 工具 |
| Direct model publishing | PublishModel | 模型发布只能通过对话流程(PublishChat)完成,不支持直接发布 |
3. Key API Details
3.1 Endpoint
- Region:
cn-east-3(default, configurable via--cli-region) - OptVerse:
optverse.{region}.myhuaweicloud.com - IAM:
iam.{region}.myhuaweicloud.com - Project ID:
{project_id}— 由脚本自动获取(复用create_chat.py的get_project_id(),通过hclouddryrun 探测),无需手动配置;也可用--project-id显式覆盖。请勿在文档或配置中硬编码个人 Project ID。
3.2 createChat Request Format (Critical)
Round 1 (submit requirement with file):
{"id": "<chat_id>", "agent_type": "optverse", "domain_type": "optverse",
"message": "需求分析", "filenames": ["需求分析输入.md"]}Round 2+ (confirmations):
{"id": "<chat_id>", "agent_type": "optverse", "agent_role": "Common",
"message": "确认", "filenames": []}Key rules:
- Round 1 MUST use
domain_type: "optverse"(notagent_role) - Round 2+ MUST use
agent_role: "Common"(notdomain_type). Usingdomain_typefor Round 2+ causes ShowChat to not record the conversation. filenamesis an array (NOTdemand_filestring — usingdemand_filecauses HTTP 500)X-Chat-Route-Idmust stay the same across all rounds
3.3 SSE Event Types
| Type | Description | Example |
|---|---|---|
messages | LLM text fragments (accumulate content) | {"type":"messages","content":"text","chat_id":"xxx"} |
custom (optvglobalstate) | Stage status transitions | {"type":"custom","event":"optv_global_state","content":{"name":"modeling","data":{"status":"RUNNING"}}} |
file | Artifact filename (download via DownloadFile) | {"type":"file","filename":"需求分析结果_xxx.md","mime_type":"text/plain"} |
text / title | Auxiliary events | |
[CONTENT_DONE] | Stream end marker (not JSON, skip) |
Stage status flow: RUNNING → SUCCESS_UNCONFIRMED → (user confirms) → SUCCESS_CONFIRMED → next stage RUNNING
Async artifact retrieval: After a stage reaches SUCCESS_UNCONFIRMED, artifact filenames may or may not appear in the initial SSE stream. If file events are present, download directly. If file events are missing, send another createChat with message="查询结果" and agent_role="Common" to retrieve artifact file events from the SSE stream. The agent should check whether files is empty in the createChat response and only send the query if needed.
Note: optv_global_state content.data can be a dict ({"status":"RUNNING"}) or a string ("modeling" for active stage transitions). Always check with isinstance.
3.4 DownloadFile
GET /v1/{project_id}/chats/{chat_id}/file/{filename}/downloadfilenamemust be URL-encoded:quote(filename, safe="")- Response JSON
contentfield is base64-encoded:base64.b64decode(content)thendecode("utf-8") - Add
X-Need-Content: trueheader
3.5 CreateArtifacts (hcloud)
hcloud OptVerse CreateArtifacts \
--chat_id=<chat_id> \
--stage_name=<requirement_analyzer|modeling|data|solver|report|business_planner|data_agent|vrp|predict_step1|predict_step2|predict_step3|predict_step4> \
--filenames.1=<file1> --filenames.2=<file2> \
--cli-region=cn-east-3--stage_name is required. Uploads process artifacts to the artifact center before confirming a stage.
3.6 PublishChat (hcloud)
hcloud OptVerse PublishChat \
--chat_id=<chat_id> \
--name="<asset_name>" \
--type=optverse \
--description="<1-2048 chars description>" \
--cli-region=cn-east-3--description is required (1-2048 chars).
4. Workflow (12 Steps: 9 Required + 3 Optional)
| Step | Action | Tool | Stage |
|---|---|---|---|
| 1 | Upload requirement file | hcloud OptVerse UploadFile | - |
| 2 | createChat Round 1 (domain_type + filenames) | create_chat.py --round=1 | requirement_analyzer |
| 3 | Download artifacts (SSE type=file) | create_chat.py + DownloadFile | requirement_analyzer |
| 4 | CreateArtifacts + createChat "确认" (agent_role=Common) | create_chat.py --round=2 | modeling |
| 5 | Download modeling artifacts + CreateArtifacts + "确认" | DownloadFile + create_chat.py | data |
| 6 | Upload xlsx data file + createChat "数据检查" | UploadFile + create_chat.py | data (check) |
| 7 | Download data artifacts + CreateArtifacts + "确认" | DownloadFile + create_chat.py | solver+report |
| 8 | Download solver+report artifacts + CreateArtifacts | DownloadFile + hcloud | solver, report |
| 9 | PublishChat | hcloud OptVerse PublishChat | - |
| 10 (optional) | CreateModelService — deploy published asset | hcloud OptVerse CreateModelService | - |
| 11 (optional) | ShowModelServiceDetail — get request URL | hcloud OptVerse ShowModelServiceDetail | - |
| 12 (optional) | CreateModelServiceTask — test the deployed service | hcloud OptVerse CreateModelServiceTask | - |
4.1 Using run_workflow.py (Full Automation)
python scripts/run_workflow.py \
--demand-file="需求分析输入.md" \
--data-file="模型数据.xlsx" \
--publish-name="工厂生产排程优化助手" \
--publish-description="优化工厂生产排程,最大化产能利用率" \
--clean-artifacts \
--deploy \
--testUse --auto-confirm to skip user confirmation prompts. Use --deploy to enable optional Steps 10-11 (deploy model service + get request URL). Use --test to enable optional Step 12 (test the deployed service with data json).
4.2 Using create_chat.py (Manual Step-by-Step)
Step 1: UploadFile
hcloud OptVerse UploadFile \
--X-Chat-Route-Id=<route-id> \
--agent_type=optverse \
--file="需求分析输入.md" \
--cli-region=cn-east-3Output: {"chat_id": "xxx"}
Step 2: createChat Round 1
python scripts/create_chat.py \
--message="需求分析" \
--filenames 需求分析输入.md \
--chat_id=<chat_id> \
--round=1Step 3: Download Artifacts
Artifact filenames come from SSE type=file events in Step 2's response.
hcloud OptVerse DownloadFile \
--chat_id=<chat_id> \
--filename=<artifact_filename> \
--X-Need-Content=true \
--cli-region=cn-east-3Present artifacts to user. Ask for confirmation.
Step 4: CreateArtifacts + createChat "确认" → modeling
hcloud OptVerse CreateArtifacts \
--chat_id=<chat_id> \
--stage_name=requirement_analyzer \
--filenames.1=<artifact_filename> \
--cli-region=cn-east-3
python scripts/create_chat.py \
--message="确认" \
--chat_id=<chat_id> \
--round=2Steps 5-7: Repeat per stage
For each stage (modeling → data → solver):
- Download artifacts from SSE
type=fileevents CreateArtifacts --stage_name=<current_stage>createChat --message="确认" --round=2
Step 6 special: Upload xlsx data file
CRITICAL: The --chat_id parameter is REQUIRED when uploading files to an existing chat session (Step 6+). Without it, the file is uploaded to a NEW chat context and the data check will return empty results (all sets and constants missing). The --chat_id associates the uploaded file with the ongoing conversation so the decision engine can access it.
hcloud OptVerse UploadFile \
--X-Chat-Route-Id=<route-id> \
--agent_type=optverse \
--chat_id=<chat_id> \
--file="模型数据.xlsx" \
--cli-region=cn-east-3
python scripts/create_chat.py \
--message="数据检查" \
--filenames 模型数据.xlsx \
--chat_id=<chat_id> \
--round=2Step 8: CreateArtifacts for solver + report
solver may auto-trigger report (both SUCCESS_CONFIRMED in one SSE stream). Split files by type:
.gz,.sol,.log,.py→--stage_name=solver.md(report) →--stage_name=report
Step 9: PublishChat
hcloud OptVerse PublishChat \
--chat_id=<chat_id> \
--name="工厂生产排程优化助手" \
--type=optverse \
--description="优化工厂生产排程,最大化产能利用率" \
--cli-region=cn-east-3Output: {"id": "xxx"} — published asset ID.
Step 10 (Optional): CreateModelService — Deploy
Deploy the published asset as a model service. See references/best-practices.md for full parameters and examples.
hcloud OptVerse CreateModelService --asset_id=<asset_id> --name="<name>" \
--infer_type=online --platform=CCE --request_mode=REAL_TIME \
--service_config.instance_count=1 --description="<desc>" --cli-region=cn-east-3Key: --platform=CCE (recommended), --request_mode=REAL_TIME (uppercase). Output: {"service_id": "xxx", "status": "RUNNING", "api_url": "..."}.
Step 11 (Optional): ShowModelServiceDetail — Get Request URL
hcloud OptVerse ShowModelServiceDetail --service_id=<service_id> --cli-region=cn-east-3Returns api_url for calling the deployed model service. See references/best-practices.md for output example.
Step 12 (Optional): CreateModelServiceTask — Test Call
Test by sending the data-stage JSON artifact as model_request. See references/best-practices.md for full flow.
hcloud OptVerse CreateModelServiceTask --service_id=<service_id> \
--inputs.model_request="<json_content>" --cli-region=cn-east-3
hcloud OptVerse ShowModelServiceTask --service_id=<service_id> --task_id=<task_id> --cli-region=cn-east-3Query task status: PENDING → RUNNING → SUCCEEDED/FAILED. Outputs include OBS download URLs for result files.
5. Core Commands
5.1 hcloud Commands
| Command | Purpose | Key Parameters |
|---|---|---|
hcloud OptVerse UploadFile | Upload requirement/data file | --file, --agent_type, --X-Chat-Route-Id |
hcloud OptVerse DownloadFile | Download artifacts | --chat_id, --filename, --X-Need-Content |
hcloud OptVerse ListArtifacts | List artifacts in artifact center | --chat_id |
hcloud OptVerse CreateArtifacts | Upload process artifacts | --chat_id, --stage_name, --filenames.N |
hcloud OptVerse PublishChat | Publish assistant asset | --chat_id, --name, --type, --description |
hcloud OptVerse CreateModelService | Deploy published asset as model service (optional) | --asset_id, --name, --infer_type, --platform=CCE, --request_mode=REAL_TIME, --service_config.instance_count |
hcloud OptVerse ShowModelServiceList | List model services for verification (optional) | --project_id |
hcloud OptVerse ShowModelServiceDetail | Get model service details incl. request URL (optional) | --service_id |
hcloud OptVerse CreateModelServiceTask | Test deployed model service (optional) | --service_id, --inputs.model_request |
hcloud OptVerse ListModelServiceTasks | List model service tasks (optional) | --service_id |
hcloud OptVerse ShowModelServiceTask | Get task details and outputs (optional) | --service_id, --task_id |
5.2 Python Scripts
| Script | Purpose |
|---|---|
scripts/create_chat.py | createChat SSE client (single call, Round 1 or 2+) |
scripts/run_workflow.py | Full 12-step workflow runner (9 required + 3 optional) with user confirmation prompts |
5.3 State Management
| State Variable | Storage | Purpose |
|---|---|---|
chat_id | Agent context | Identifies conversation thread |
X-Chat-Route-Id | Agent context | Routes to same backend; must stay same across all rounds |
| IAM credentials | ~/.config/optverse/credentials (values cleared after reading) | User writes credentials, agent reads and clears values |
| IAM token | In-memory only (process lifetime) | 23h cache, never written to disk |
6. Stage Artifacts
| Stage | Artifact Files | Description |
|---|---|---|
| requirement_analyzer | 需求分析结果_xxx.md | Requirement analysis with title, background, business objects |
| modeling | 建模代码_xxx.py, 建模文档_xxx.md, 模型数据_xxx.xlsx, 模型数据_xxx.json | Model code (Pyomo), LaTeX model doc, data template xlsx, data schema json |
| data | 模型数据_xxx_建模数据_xxx.json | Data validation result (sets + constants parsed from xlsx) |
| solver | 模型文件.lp_xxx.gz, 模型求解结果_xxx.sol, 模型求解日志_xxx.log, 建模脚本_xxx.py | LP model file, solution, solver log, solving script |
| report | 结果报告_xxx.md | Summary report with business insights and solver status |
7. Parameters
| Parameter | Default | Description | Required |
|---|---|---|---|
--cli-region | cn-east-3 | Huawei Cloud region | Yes |
--agent_type | optverse | Agent type | Yes |
--round | 1 | Round number (1=domaintype, 2+=agentrole) | Yes |
--filenames | [] | File name array (Round 1: demand file; Round 2+: empty) | Round 1 only |
--chat_id | (none) | Chat ID from UploadFile | Steps 2-9 |
--stage_name | (none) | Stage name for CreateArtifacts | Steps 4,5,7,8 |
8. File Requirements
| File | Type | Purpose |
|---|---|---|
| Requirement analysis | .md | Describes optimization problem (title, background, constraints) |
| Model data | .xlsx | Input data for the model (filled from modeling output template) |
Note: The modeling stage produces a 模型数据_xxx.xlsx template. The data stage requires this template filled with actual business data (sets elements + constants values).
9. Best Practices
See references/best-practices.md for full best practices and notes. Key points:
- Always confirm with user between stages; track
chat_idandroute_idacross all rounds - UploadFile `--chat_id` is required for Step 6+ (existing sessions) — without it, data check returns empty
- Never expose IAM token or credentials; use
Bashtool to clear credentials file - Avoid PowerShell piping for hcloud output (BOM issues) — use
subprocess.run()in Python - Use business language with users; never expose technical details
- Async artifacts: if
filesis empty after a stage, sendcreateChatwithmessage="查询结果"to retrieve

