Rendu depuis le dépôt source en conservant titres, exemples, code, tableaux, liens et images.
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

